home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk5 / showfont / showfont.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  45KB  |  1,339 lines

  1. /********************************************/
  2. /*   ShowFont 2.0 - by Arthur Johnson Jr.   */
  3. /* ======================================== */
  4. /* Usage: ShowFont [font_name] [font_size]  */
  5. /* ======================================== */
  6. /*      Last modifications - 09/07/88       */
  7. /********************************************/
  8.  
  9. #include "intuition/intuition.h" /* this one includes heaps o' stuff */
  10. #include "exec/memory.h"
  11. #include "libraries/diskfont.h"
  12.  
  13. #define XAREA        617    /* no characters beyond this pixel */
  14. #define FONTBUFFER  5000    /* works for me */
  15. #define FONTNAMELEN   24    /* 23 characters plus the '\0' */
  16. #define MAXSIZES      20    /* hopefully this is overly generous */
  17.  
  18. /****************************************************/
  19. /* All screen/window/gadget structures created with */
  20. /*              PowerWindows 2.0,  by:              */
  21. /* Inovatronics, Inc.                               */
  22. /* 11311 Stemmons Freeway                           */
  23. /* Dallas, TX  75229                                */
  24. /* (214) 241-9515                                   */
  25. /****************************************************/
  26.  
  27. struct PropInfo W_PropSInfo = {
  28.         AUTOKNOB+FREEVERT,      /* PROPINFO flags */
  29.         -1,-1,  /* horizontal and vertical pot values */
  30.         -1,-1,  /* horizontal and vertical body values */
  31. };
  32.  
  33. struct Image Image1 = {
  34.         0,0,    /* XY origin relative to container TopLeft */
  35.         8,167,  /* Image width and height in pixels */
  36.         0,      /* number of bitplanes in Image */
  37.         NULL,   /* pointer to ImageData */
  38.         0x0000,0x0000,  /* PlanePick and PlaneOnOff */
  39.         NULL    /* next Image structure */
  40. };
  41.  
  42. struct Gadget W_Prop = {
  43.         NULL,   /* next gadget */
  44.         619,19, /* origin XY of hit box relative to window TopLeft */
  45.         16,171, /* hit box width and height */
  46.         NULL,   /* gadget flags */
  47.         RELVERIFY,      /* activation flags */
  48.         PROPGADGET,     /* gadget type flags */
  49.         (APTR)&Image1,  /* gadget border or image to be rendered */
  50.         NULL,   /* alternate imagery for selection */
  51.         NULL,   /* first IntuiText structure */
  52.         NULL,   /* gadget mutual-exclude long word */
  53.         (APTR)&W_PropSInfo,     /* SpecialInfo structure */
  54.         2,      /* user-definable data */
  55.         NULL    /* pointer to user-definable data */
  56. };
  57.  
  58. USHORT ImageDownData[] = {
  59.         0xFFFF,0x8001,0x8181,0x8181,0x87E1,0x83C1,0x8181,0x8001,
  60.         0xFFFF
  61. };
  62.  
  63. struct Image ImageDown = {
  64.         0,0,    /* XY origin relative to container TopLeft */
  65.         16,9,   /* Image width and height in pixels */
  66.         2,      /* number of bitplanes in Image */
  67.         ImageDownData,     /* pointer to ImageData */
  68.         0x0001,0x0000,  /* PlanePick and PlaneOnOff */
  69.         NULL    /* next Image structure */
  70. };
  71.  
  72. struct Gadget W_Down = {
  73.         &W_Prop,        /* next gadget */
  74.         619,190,        /* origin XY of hit box relative to window TopLeft */
  75.         16,9,   /* hit box width and height */
  76.         GADGIMAGE,      /* gadget flags */
  77.         RELVERIFY,      /* activation flags */
  78.         BOOLGADGET,     /* gadget type flags */
  79.         (APTR)&ImageDown,  /* gadget border or image to be rendered */
  80.         NULL,   /* alternate imagery for selection */
  81.         NULL,   /* first IntuiText structure */
  82.         NULL,   /* gadget mutual-exclude long word */
  83.         NULL,   /* SpecialInfo structure */
  84.         3,      /* user-definable data */
  85.         NULL    /* pointer to user-definable data */
  86. };
  87.  
  88. USHORT ImageUpData[] = {
  89.         0xFFFF,0x8001,0x8181,0x83C1,0x87E1,0x8181,0x8181,0x8001,
  90.         0xFFFF
  91. };
  92.  
  93. struct Image ImageUp = {
  94.         0,0,    /* XY origin relative to container TopLeft */
  95.         16,9,   /* Image width and height in pixels */
  96.         2,      /* number of bitplanes in Image */
  97.         ImageUpData,     /* pointer to ImageData */
  98.         0x0001,0x0000,  /* PlanePick and PlaneOnOff */
  99.         NULL    /* next Image structure */
  100. };
  101.  
  102. struct Gadget W_Up = {
  103.         &W_Down,        /* next gadget */
  104.         619,10, /* origin XY of hit box relative to window TopLeft */
  105.         16,9,   /* hit box width and height */
  106.         GADGIMAGE,      /* gadget flags */
  107.         RELVERIFY,      /* activation flags */
  108.         BOOLGADGET,     /* gadget type flags */
  109.         (APTR)&ImageUp,  /* gadget border or image to be rendered */
  110.         NULL,   /* alternate imagery for selection */
  111.         NULL,   /* first IntuiText structure */
  112.         NULL,   /* gadget mutual-exclude long word */
  113.         NULL,   /* SpecialInfo structure */
  114.         1,      /* user-definable data */
  115.         NULL    /* pointer to user-definable data */
  116. };
  117.  
  118. #define GadgetList1 W_Up
  119.  
  120. struct IntuiText IText1 = {
  121.         3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */
  122.         0,0,    /* XY origin relative to container TopLeft */
  123.         NULL,   /* font pointer or NULL for default */
  124.         "Font Selection",       /* pointer to text */
  125.         NULL    /* next IntuiText structure */
  126. };
  127.  
  128. struct MenuItem MenuItem2 = {
  129.         NULL,   /* next MenuItem structure */
  130.         0,9,    /* XY of Item hitbox relative to TopLeft of parent hitbox */
  131.         152,8,  /* hit box width and height */
  132.         ITEMTEXT+COMMSEQ+HIGHCOMP,  /* Item flags */
  133.         0,      /* each bit mutually-excludes a same-level Item */
  134.         (APTR)&IText1,  /* Item render  (IntuiText or Image or NULL) */
  135.         NULL,   /* Select render */
  136.         'F',    /* alternate command-key */
  137.         NULL,   /* SubItem list */
  138.         MENUNULL        /* filled in by Intuition for drag selections */
  139. };
  140.  
  141. struct IntuiText IText2 = {
  142.         3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */
  143.         0,0,    /* XY origin relative to container TopLeft */
  144.         NULL,   /* font pointer or NULL for default */
  145.         "Read FONTS:",  /* pointer to text */
  146.         NULL    /* next IntuiText structure */
  147. };
  148.  
  149. struct MenuItem MenuItem1 = {
  150.         &MenuItem2,     /* next MenuItem structure */
  151.         0,0,    /* XY of Item hitbox relative to TopLeft of parent hitbox */
  152.         152,8,  /* hit box width and height */
  153.         ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,  /* Item flags */
  154.         0,      /* each bit mutually-excludes a same-level Item */
  155.         (APTR)&IText2,  /* Item render  (IntuiText or Image or NULL) */
  156.         NULL,   /* Select render */
  157.         'R',    /* alternate command-key */
  158.         NULL,   /* SubItem list */
  159.         MENUNULL        /* filled in by Intuition for drag selections */
  160. };
  161.  
  162. struct Menu Menu2 = {
  163.         NULL,   /* next Menu structure */
  164.         82,0,   /* XY origin of Menu hit box relative to screen TopLeft */
  165.         57,0,   /* Menu hit box width and height */
  166.         MENUENABLED,    /* Menu flags */
  167.         "Fonts",        /* text of Menu name */
  168.         &MenuItem1      /* MenuItem linked list pointer */
  169. };
  170.  
  171. struct IntuiText IText3 = {
  172.         3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */
  173.         0,0,    /* XY origin relative to container TopLeft */
  174.         NULL,   /* font pointer or NULL for default */
  175.         "Quit", /* pointer to text */
  176.         NULL    /* next IntuiText structure */
  177. };
  178.  
  179. struct MenuItem MenuItem4 = {
  180.         NULL,   /* next MenuItem structure */
  181.         0,9,    /* XY of Item hitbox relative to TopLeft of parent hitbox */
  182.         80,8,   /* hit box width and height */
  183.         ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,  /* Item flags */
  184.         0,      /* each bit mutually-excludes a same-level Item */
  185.         (APTR)&IText3,  /* Item render  (IntuiText or Image or NULL) */
  186.         NULL,   /* Select render */
  187.         'Q',    /* alternate command-key */
  188.         NULL,   /* SubItem list */
  189.         MENUNULL        /* filled in by Intuition for drag selections */
  190. };
  191.  
  192. struct IntuiText IText4 = {
  193.         3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */
  194.         0,0,    /* XY origin relative to container TopLeft */
  195.         NULL,   /* font pointer or NULL for default */
  196.         "About",        /* pointer to text */
  197.         NULL    /* next IntuiText structure */
  198. };
  199.  
  200. struct MenuItem MenuItem3 = {
  201.         &MenuItem4,     /* next MenuItem structure */
  202.         0,0,    /* XY of Item hitbox relative to TopLeft of parent hitbox */
  203.         80,8,   /* hit box width and height */
  204.         ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,  /* Item flags */
  205.         0,      /* each bit mutually-excludes a same-level Item */
  206.         (APTR)&IText4,  /* Item render  (IntuiText or Image or NULL) */
  207.         NULL,   /* Select render */
  208.         'A',    /* alternate command-key */
  209.         NULL,   /* SubItem list */
  210.         MENUNULL        /* filled in by Intuition for drag selections */
  211. };
  212.  
  213. struct Menu Menu1 = {
  214.         &Menu2, /* next Menu structure */
  215.         0,0,    /* XY origin of Menu hit box relative to screen TopLeft */
  216.         75,0,   /* Menu hit box width and height */
  217.         MENUENABLED,    /* Menu flags */
  218.         "Project",      /* text of Menu name */
  219.         &MenuItem3      /* MenuItem linked list pointer */
  220. };
  221.  
  222. #define MenuList1 Menu1
  223.  
  224. struct NewWindow newwindow = {
  225.         0,0,    /* window XY origin relative to TopLeft of screen */
  226.         640,200,        /* window width and height */
  227.         0,1,    /* detail and block pens */
  228.         GADGETUP+MENUPICK+CLOSEWINDOW,  /* IDCMP flags */
  229.         WINDOWDEPTH+WINDOWCLOSE+ACTIVATE,       /* other window flags */
  230.         &GadgetList1,  /* first gadget in gadget list */
  231.         NULL,   /* custom CHECKMARK imagery */
  232.         "ShowFont 2.0 by Arthur Johnson Jr.",   /* window title */
  233.         NULL,   /* custom screen pointer */
  234.         NULL,   /* custom bitmap */
  235.         -1,-1,  /* minimum width and height */
  236.         -1,-1,  /* maximum width and height */
  237.         WBENCHSCREEN    /* destination screen type */
  238. };
  239.  
  240. SHORT BorderVectors2[] = {
  241.         0,0,
  242.         29,0,
  243.         29,58,
  244.         0,58,
  245.         0,0
  246. };
  247. struct Border Border2 = {
  248.         246,8,  /* XY origin relative to container TopLeft */
  249.         1,0,JAM1,       /* front pen, back pen and drawmode */
  250.         5,      /* number of XY vectors */
  251.         BorderVectors2, /* pointer to XY vectors */
  252.         NULL    /* next border in list */
  253. };
  254.  
  255. SHORT BorderVectors1[] = {
  256.         0,0,
  257.         188,0,
  258.         188,58,
  259.         0,58,
  260.         0,0
  261. };
  262. struct Border Border1 = {
  263.         5,8,    /* XY origin relative to container TopLeft */
  264.         1,0,JAM1,       /* front pen, back pen and drawmode */
  265.         5,      /* number of XY vectors */
  266.         BorderVectors1, /* pointer to XY vectors */
  267.         &Border2        /* next border in list */
  268. };
  269.  
  270. struct Gadget Gadget12 = {
  271.         NULL,   /* next gadget */
  272.         0,0,    /* origin XY of hit box relative to window TopLeft */
  273.         1,1,    /* hit box width and height */
  274.         GADGHBOX+GADGHIMAGE,    /* gadget flags */
  275.         NULL,   /* activation flags */
  276.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  277.         (APTR)&Border1, /* gadget border or image to be rendered */
  278.         NULL,   /* alternate imagery for selection */
  279.         NULL,   /* first IntuiText structure */
  280.         NULL,   /* gadget mutual-exclude long word */
  281.         NULL,   /* SpecialInfo structure */
  282.         NULL,   /* user-definable data */
  283.         NULL    /* pointer to user-definable data */
  284. };
  285.  
  286. SHORT BorderVectors3[] = {
  287.         0,0,
  288.         60,0,
  289.         60,16,
  290.         0,16,
  291.         0,0
  292. };
  293. struct Border Border3 = {
  294.         -2,-1,  /* XY origin relative to container TopLeft */
  295.         1,0,JAM1,       /* front pen, back pen and drawmode */
  296.         5,      /* number of XY vectors */
  297.         BorderVectors3, /* pointer to XY vectors */
  298.         NULL    /* next border in list */
  299. };
  300.  
  301. struct IntuiText IText5 = {
  302.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  303.         6,4,    /* XY origin relative to container TopLeft */
  304.         NULL,   /* font pointer or NULL for default */
  305.         "Cancel",       /* pointer to text */
  306.         NULL    /* next IntuiText structure */
  307. };
  308.  
  309. struct Gadget R_Cancel = {
  310.         &Gadget12,      /* next gadget */
  311.         185,76, /* origin XY of hit box relative to window TopLeft */
  312.         57,15,  /* hit box width and height */
  313.         NULL,   /* gadget flags */
  314.         RELVERIFY+ENDGADGET,    /* activation flags */
  315.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  316.         (APTR)&Border3, /* gadget border or image to be rendered */
  317.         NULL,   /* alternate imagery for selection */
  318.         &IText5,        /* first IntuiText structure */
  319.         NULL,   /* gadget mutual-exclude long word */
  320.         NULL,   /* SpecialInfo structure */
  321.         102,    /* user-definable data */
  322.         NULL    /* pointer to user-definable data */
  323. };
  324.  
  325. SHORT BorderVectors4[] = {
  326.         0,0,
  327.         60,0,
  328.         60,16,
  329.         0,16,
  330.         0,0
  331. };
  332. struct Border Border4 = {
  333.         -2,-1,  /* XY origin relative to container TopLeft */
  334.         1,0,JAM1,       /* front pen, back pen and drawmode */
  335.         5,      /* number of XY vectors */
  336.         BorderVectors4, /* pointer to XY vectors */
  337.         NULL    /* next border in list */
  338. };
  339.  
  340. struct IntuiText IText6 = {
  341.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  342.         20,4,   /* XY origin relative to container TopLeft */
  343.         NULL,   /* font pointer or NULL for default */
  344.         "OK",   /* pointer to text */
  345.         NULL    /* next IntuiText structure */
  346. };
  347.  
  348. struct Gadget R_OK = {
  349.         &R_Cancel,      /* next gadget */
  350.         70,76,  /* origin XY of hit box relative to window TopLeft */
  351.         57,15,  /* hit box width and height */
  352.         NULL,   /* gadget flags */
  353.         RELVERIFY+ENDGADGET,    /* activation flags */
  354.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  355.         (APTR)&Border4, /* gadget border or image to be rendered */
  356.         NULL,   /* alternate imagery for selection */
  357.         &IText6,        /* first IntuiText structure */
  358.         NULL,   /* gadget mutual-exclude long word */
  359.         NULL,   /* SpecialInfo structure */
  360.         101,    /* user-definable data */
  361.         NULL    /* pointer to user-definable data */
  362. };
  363.  
  364. struct Gadget R_SizeDown = {
  365.         &R_OK,  /* next gadget */
  366.         279,58, /* origin XY of hit box relative to window TopLeft */
  367.         16,9,   /* hit box width and height */
  368.         GADGIMAGE,      /* gadget flags */
  369.         RELVERIFY,      /* activation flags */
  370.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  371.         (APTR)&ImageDown,  /* gadget border or image to be rendered */
  372.         NULL,   /* alternate imagery for selection */
  373.         NULL,   /* first IntuiText structure */
  374.         NULL,   /* gadget mutual-exclude long word */
  375.         NULL,   /* SpecialInfo structure */
  376.         23,     /* user-definable data */
  377.         NULL    /* pointer to user-definable data */
  378. };
  379.  
  380. struct PropInfo R_SizeSInfo = {
  381.         AUTOKNOB+FREEVERT,      /* PROPINFO flags */
  382.         -1,-1,  /* horizontal and vertical pot values */
  383.         -1,-1,  /* horizontal and vertical body values */
  384. };
  385.  
  386. struct Image Image5 = {
  387.         0,0,    /* XY origin relative to container TopLeft */
  388.         8,37,   /* Image width and height in pixels */
  389.         0,      /* number of bitplanes in Image */
  390.         NULL,   /* pointer to ImageData */
  391.         0x0000,0x0000,  /* PlanePick and PlaneOnOff */
  392.         NULL    /* next Image structure */
  393. };
  394.  
  395. struct Gadget R_Size = {
  396.         &R_SizeDown,    /* next gadget */
  397.         279,17, /* origin XY of hit box relative to window TopLeft */
  398.         16,41,  /* hit box width and height */
  399.         NULL,   /* gadget flags */
  400.         RELVERIFY,      /* activation flags */
  401.         PROPGADGET+REQGADGET,   /* gadget type flags */
  402.         (APTR)&Image5,  /* gadget border or image to be rendered */
  403.         NULL,   /* alternate imagery for selection */
  404.         NULL,   /* first IntuiText structure */
  405.         NULL,   /* gadget mutual-exclude long word */
  406.         (APTR)&R_SizeSInfo,     /* SpecialInfo structure */
  407.         22,     /* user-definable data */
  408.         NULL    /* pointer to user-definable data */
  409. };
  410.  
  411. struct Gadget R_SizeUp = {
  412.         &R_Size,        /* next gadget */
  413.         279,8,  /* origin XY of hit box relative to window TopLeft */
  414.         16,9,   /* hit box width and height */
  415.         GADGIMAGE,      /* gadget flags */
  416.         RELVERIFY,      /* activation flags */
  417.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  418.         (APTR)&ImageUp,  /* gadget border or image to be rendered */
  419.         NULL,   /* alternate imagery for selection */
  420.         NULL,   /* first IntuiText structure */
  421.         NULL,   /* gadget mutual-exclude long word */
  422.         NULL,   /* SpecialInfo structure */
  423.         21,     /* user-definable data */
  424.         NULL    /* pointer to user-definable data */
  425. };
  426.  
  427. struct PropInfo R_FontSInfo = {
  428.         AUTOKNOB+FREEVERT,      /* PROPINFO flags */
  429.         -1,-1,  /* horizontal and vertical pot values */
  430.         -1,-1,  /* horizontal and vertical body values */
  431. };
  432.  
  433. struct Image Image7 = {
  434.         0,0,    /* XY origin relative to container TopLeft */
  435.         8,37,   /* Image width and height in pixels */
  436.         0,      /* number of bitplanes in Image */
  437.         NULL,   /* pointer to ImageData */
  438.         0x0000,0x0000,  /* PlanePick and PlaneOnOff */
  439.         NULL    /* next Image structure */
  440. };
  441.  
  442. struct Gadget R_Font = {
  443.         &R_SizeUp,      /* next gadget */
  444.         197,17, /* origin XY of hit box relative to window TopLeft */
  445.         16,41,  /* hit box width and height */
  446.         NULL,   /* gadget flags */
  447.         RELVERIFY,      /* activation flags */
  448.         PROPGADGET+REQGADGET,   /* gadget type flags */
  449.         (APTR)&Image7,  /* gadget border or image to be rendered */
  450.         NULL,   /* alternate imagery for selection */
  451.         NULL,   /* first IntuiText structure */
  452.         NULL,   /* gadget mutual-exclude long word */
  453.         (APTR)&R_FontSInfo,     /* SpecialInfo structure */
  454.         12,     /* user-definable data */
  455.         NULL    /* pointer to user-definable data */
  456. };
  457.  
  458. struct Gadget R_FontDown = {
  459.         &R_Font,        /* next gadget */
  460.         197,58, /* origin XY of hit box relative to window TopLeft */
  461.         16,9,   /* hit box width and height */
  462.         GADGIMAGE,      /* gadget flags */
  463.         RELVERIFY,      /* activation flags */
  464.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  465.         (APTR)&ImageDown,  /* gadget border or image to be rendered */
  466.         NULL,   /* alternate imagery for selection */
  467.         NULL,   /* first IntuiText structure */
  468.         NULL,   /* gadget mutual-exclude long word */
  469.         NULL,   /* SpecialInfo structure */
  470.         13,     /* user-definable data */
  471.         NULL    /* pointer to user-definable data */
  472. };
  473.  
  474. struct Gadget R_FontUp = {
  475.         &R_FontDown,    /* next gadget */
  476.         197,8,  /* origin XY of hit box relative to window TopLeft */
  477.         16,9,   /* hit box width and height */
  478.         GADGIMAGE,      /* gadget flags */
  479.         RELVERIFY,      /* activation flags */
  480.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  481.         (APTR)&ImageUp,  /* gadget border or image to be rendered */
  482.         NULL,   /* alternate imagery for selection */
  483.         NULL,   /* first IntuiText structure */
  484.         NULL,   /* gadget mutual-exclude long word */
  485.         NULL,   /* SpecialInfo structure */
  486.         11,     /* user-definable data */
  487.         NULL    /* pointer to user-definable data */
  488. };
  489.  
  490. #define GadgetList2 R_FontUp
  491.  
  492. SHORT BorderVectors6[] = {
  493.         0,0,
  494.         299,0,
  495.         299,99,
  496.         0,99,
  497.         0,0
  498. };
  499. struct Border Border6 = {
  500.         0, 0,  /* XY origin relative to container TopLeft */
  501.         1,0,JAM1,       /* front pen, back pen and drawmode */
  502.         5,      /* number of XY vectors */
  503.         BorderVectors6, /* pointer to XY vectors */
  504.         NULL    /* next border in list */
  505. };
  506.  
  507. struct Requester requester1 = {
  508.         NULL,   /* previous requester (filled in by Intuition) */
  509.         170,50, /* requester XY origin relative to TopLeft of window */
  510.         300,100,        /* requester width and height */
  511.         0,0,    /* relative to these mouse offsets if POINTREL is set */
  512.         &GadgetList2,   /* gadget list */
  513.         &Border6,   /* box's border */
  514.         NULL,   /* requester text */
  515.         NULL,   /* requester flags */
  516.         0,      /* back-plane fill pen */
  517.         NULL,   /* leave these alone */
  518.         NULL,   /* custom bitmap if PREDRAWN is set */
  519.         NULL    /* leave this alone */
  520. };
  521.  
  522. SHORT BorderVectors5[] = {
  523.         0,0,
  524.         99,0,
  525.         99,25,
  526.         0,25,
  527.         0,0
  528. };
  529. struct Border Border5 = {
  530.         -2,-1,  /* XY origin relative to container TopLeft */
  531.         1,0,JAM1,       /* front pen, back pen and drawmode */
  532.         5,      /* number of XY vectors */
  533.         BorderVectors5, /* pointer to XY vectors */
  534.         NULL    /* next border in list */
  535. };
  536.  
  537. struct IntuiText IText7 = {
  538.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  539.         36,8,   /* XY origin relative to container TopLeft */
  540.         NULL,   /* font pointer or NULL for default */
  541.         "DUH",  /* pointer to text */
  542.         NULL    /* next IntuiText structure */
  543. };
  544.  
  545. struct Gadget Gadget5 = {
  546.         NULL,   /* next gadget */
  547.         56,65,  /* origin XY of hit box relative to window TopLeft */
  548.         96,24,  /* hit box width and height */
  549.         NULL,   /* gadget flags */
  550.         RELVERIFY+ENDGADGET,    /* activation flags */
  551.         BOOLGADGET+REQGADGET,   /* gadget type flags */
  552.         (APTR)&Border5, /* gadget border or image to be rendered */
  553.         NULL,   /* alternate imagery for selection */
  554.         &IText7,        /* first IntuiText structure */
  555.         NULL,   /* gadget mutual-exclude long word */
  556.         NULL,   /* SpecialInfo structure */
  557.         NULL,   /* user-definable data */
  558.         NULL    /* pointer to user-definable data */
  559. };
  560.  
  561. #define GadgetList3 Gadget5
  562.  
  563. struct IntuiText IText12 = {
  564.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  565.         80,43,  /* XY origin relative to container TopLeft */
  566.         NULL,   /* font pointer or NULL for default */
  567.         "fonts.",       /* pointer to text */
  568.         NULL    /* next IntuiText structure */
  569. };
  570.  
  571. struct IntuiText IText11 = {
  572.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  573.         20,34,  /* XY origin relative to container TopLeft */
  574.         NULL,   /* font pointer or NULL for default */
  575.         "This program displays",        /* pointer to text */
  576.         &IText12        /* next IntuiText structure */
  577. };
  578.  
  579. struct IntuiText IText10 = {
  580.         1,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  581.         8,19,   /* XY origin relative to container TopLeft */
  582.         NULL,   /* font pointer or NULL for default */
  583.         "Last revision - 09/07/88",     /* pointer to text */
  584.         &IText11        /* next IntuiText structure */
  585. };
  586.  
  587. struct IntuiText IText9 = {
  588.         3,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  589.         20,10,  /* XY origin relative to container TopLeft */
  590.         NULL,   /* font pointer or NULL for default */
  591.         "by Arthur Johnson Jr.",        /* pointer to text */
  592.         &IText10        /* next IntuiText structure */
  593. };
  594.  
  595. struct IntuiText IText8 = {
  596.         3,0,JAM2,       /* front and back text pens, drawmode and fill byte */
  597.         56,2,   /* XY origin relative to container TopLeft */
  598.         NULL,   /* font pointer or NULL for default */
  599.         "ShowFont 2.0", /* pointer to text */
  600.         &IText9 /* next IntuiText structure */
  601. };
  602.  
  603. #define IntuiTextList3 IText8
  604.  
  605. SHORT BorderVectors7[] = {
  606.         0,0,
  607.         207,0,
  608.         207,99,
  609.         0,99,
  610.         0,0
  611. };
  612. struct Border Border7 = {
  613.         0, 0,  /* XY origin relative to container TopLeft */
  614.         1,0,JAM1,       /* front pen, back pen and drawmode */
  615.         5,      /* number of XY vectors */
  616.         BorderVectors7, /* pointer to XY vectors */
  617.         NULL    /* next border in list */
  618. };
  619.  
  620. struct Requester requester2 = {
  621.         NULL,   /* previous requester (filled in by Intuition) */
  622.         216,50, /* requester XY origin relative to TopLeft of window */
  623.         208,100,        /* requester width and height */
  624.         0,0,    /* relative to these mouse offsets if POINTREL is set */
  625.         &GadgetList3,   /* gadget list */
  626.         &Border7,   /* box's border */
  627.         &IntuiTextList3,        /* requester text */
  628.         NULL,   /* requester flags */
  629.         0,      /* back-plane fill pen */
  630.         NULL,   /* leave these alone */
  631.         NULL,   /* custom bitmap if PREDRAWN is set */
  632.         NULL    /* leave this alone */
  633. };
  634.  
  635. struct Window *window;
  636. struct RastPort *rp;
  637. struct Gadget *whichgad;
  638.  
  639. struct IntuitionBase *IntuitionBase;
  640. struct GfxBase *GfxBase;
  641. struct DiskfontBase *DiskfontBase;
  642.  
  643. char  fontname[FONTNAMELEN + 5]; /* include space for '.font' */
  644. UWORD fontsize;
  645.  
  646. int numfonts; /* I'm tired of passing this around */
  647.  
  648. struct TextAttr myfont = { /* necessary structure for fonts */
  649.     fontname,
  650.     0,
  651.     0,
  652.     0 };
  653. struct TextFont *font;
  654.  
  655. UBYTE textline[256];
  656. struct IntuiText text = {
  657.     1, 0,
  658.     JAM2,
  659.     0, 0,
  660.     &myfont,
  661.     textline,
  662.     NULL };
  663.  
  664. struct fontinfo {
  665.     struct fontinfo *next;
  666.     char name[FONTNAMELEN];
  667.     int  sizes;
  668.     int  size[MAXSIZES];
  669.     int  whichsel;
  670. } *fonts;
  671.  
  672. struct Gadget thegads[14];
  673. struct IntuiText theitext[14];
  674. UBYTE  thetext1[7][FONTNAMELEN],
  675.        thetext2[7][4];
  676.  
  677. void cleanup(text)
  678. char *text;
  679. {
  680.  
  681.     struct fontinfo *nextfont;
  682.  
  683.     if (fonts)
  684.         while (fonts) {
  685.             nextfont = fonts->next;
  686.             FreeMem(fonts, sizeof(struct fontinfo));
  687.             fonts = nextfont;
  688.         }
  689.     if (font)
  690.         CloseFont(font);
  691.     if (window) {
  692.         ClearMenuStrip(window);
  693.         CloseWindow(window);
  694.     }
  695.     if (DiskfontBase)
  696.         CloseLibrary(DiskfontBase);
  697.     if (IntuitionBase)
  698.         CloseLibrary(IntuitionBase);
  699.     if (GfxBase)
  700.         CloseLibrary(GfxBase);
  701.  
  702.     if (text)
  703.         puts(text);
  704.  
  705.     exit();
  706.  
  707. }
  708.  
  709. void *fontaddress(which)
  710. int which;
  711. {
  712.  
  713.     struct fontinfo *duh;
  714.  
  715.     duh = fonts;
  716.  
  717.     while (which-- != 0)
  718.         duh = duh->next;
  719.  
  720.     return((void *)duh);
  721.  
  722. }
  723.  
  724. void *addfont(next, name, size)
  725. struct fontinfo *next;
  726. char *name;
  727. int size;
  728. {
  729.  
  730.     struct fontinfo *font;
  731.  
  732.     font = (struct fontinfo *)AllocMem(sizeof(struct fontinfo), MEMF_CLEAR);
  733.     if (font == NULL)
  734.         cleanup("ShowFont: couldn't allocate enough memory!");
  735.     font->next = next;
  736.     stccpy(font->name, name, (strlen(name) - 4));
  737.     font->sizes = 1;
  738.     font->size[0] = size;
  739.     font->whichsel = 0;
  740.  
  741.     return((void *)font);
  742.  
  743. }
  744.  
  745. void readfonts()
  746. {
  747.  
  748.     struct AvailFontsHeader *afh;
  749.     struct AvailFonts *af;
  750.  
  751.     struct fontinfo *font, *prev;
  752.  
  753.     int mem = FONTBUFFER,
  754.         moremem,
  755.         goya,
  756.         foundit;
  757.  
  758.     register i, j;
  759.  
  760.     numfonts = 0;
  761.     fonts = NULL;
  762.  
  763.     do {
  764.         afh = (struct AvailFontsHeader *)AllocMem(mem, MEMF_CLEAR);
  765.         if (afh == NULL)
  766.             cleanup("ShowFont: couldn't allocate enough memory!");
  767.         moremem = AvailFonts(afh, mem, 0xFF);
  768.         if (moremem != 0) {
  769.             FreeMem(afh, mem);
  770.             mem += moremem;
  771.             printf("ShowFont: allocating %d bytes of memory for the FONTS: info.\n", mem);
  772.         }
  773.     } while (moremem != 0);
  774.  
  775.     if (afh->afh_NumEntries == 0) {
  776.         FreeMem(afh, mem);
  777.         cleanup("ShowFont: couldn't find any fonts! (Is FONTS: set correctly?)");
  778.     }
  779.  
  780.     af = (struct AvailFonts *)&afh[1];
  781.     for (i = 0; i < afh->afh_NumEntries; i++) {
  782.         if (!((af->af_Attr.ta_Flags & FPF_REMOVED) ||
  783.             (af->af_Attr.ta_Flags & FPF_REVPATH) ||
  784.             ((af->af_Type & AFF_MEMORY) &&
  785.              (af->af_Attr.ta_Flags & FPF_DISKFONT)))) {
  786.             prev = NULL;
  787.             font = fonts;
  788.             foundit = FALSE;
  789.             while ((font != NULL) && (foundit == FALSE)) {
  790.                 goya = strnicmp(af->af_Attr.ta_Name, font->name, (strlen(af->af_Attr.ta_Name) - 5));
  791.                 if (goya == 0) {
  792.                     j = font->sizes - 1;
  793.                     while ((j >= 0) && (font->size[j] > af->af_Attr.ta_YSize)) {
  794.                         font->size[j + 1] = font->size[j];
  795.                         --j;
  796.                     }
  797.                     font->size[j + 1] = af->af_Attr.ta_YSize;
  798.                     ++font->sizes;
  799.                     foundit = TRUE;
  800.                 }
  801.                 else if (goya < 0) {
  802.                         if (prev == NULL)
  803.                             fonts = (struct fontinfo *)addfont(font, af->af_Attr.ta_Name, af->af_Attr.ta_YSize);
  804.                         else
  805.                             prev->next = (struct fontinfo *)addfont(font, af->af_Attr.ta_Name, af->af_Attr.ta_YSize);
  806.                         ++numfonts;
  807.                         foundit = TRUE;
  808.                     }
  809.                     else {
  810.                         prev = font;
  811.                         font = font->next;
  812.                     }
  813.             }
  814.             if (foundit == FALSE) {
  815.                 if (prev == NULL)
  816.                     fonts = (struct fontinfo *)addfont(NULL, af->af_Attr.ta_Name, af->af_Attr.ta_YSize);
  817.                 else
  818.                     prev->next = (struct fontinfo *)addfont(NULL, af->af_Attr.ta_Name, af->af_Attr.ta_YSize);
  819.                 ++numfonts;
  820.             }
  821.         }
  822.         af++;
  823.     }
  824.  
  825.     FreeMem(afh, mem);
  826.  
  827.     if (MenuItem2.Flags == ITEMTEXT+COMMSEQ+HIGHCOMP) {
  828.         OnMenu(window, SHIFTMENU(1) | SHIFTITEM(1));
  829.         MenuItem2.Flags |= ITEMENABLED;
  830.     }
  831.  
  832. }
  833.  
  834. void setupfont()
  835. {
  836.  
  837.     char windowtitle[80];
  838.  
  839.     if (font)
  840.         CloseFont(font);
  841.  
  842.     myfont.ta_YSize = fontsize;
  843.     if ((font = (struct TextFont *)OpenDiskFont(&myfont)) == NULL)
  844.         cleanup("ShowFont: couldn't find the font.");
  845.     fontsize = font->tf_YSize;
  846.  
  847.     stccpy(windowtitle, fontname, (strlen(fontname) - 4));
  848.     sprintf(windowtitle + strlen(windowtitle), " - %d (ShowFont 2.0 by Arthur Johnson Jr.)", fontsize);
  849.     SetWindowTitles(window, windowtitle, -1);
  850.  
  851. }
  852.  
  853. int findfont()
  854. {
  855.  
  856.     struct fontinfo *search;
  857.  
  858.     int foundit,
  859.         which,
  860.         i;
  861.  
  862.     which = 0;
  863.     search = fonts;
  864.     foundit = FALSE;
  865.     while ((search != NULL) && (!foundit)) {
  866.         if (!(strnicmp(fontname, search->name, (strlen(fontname) - 5))))
  867.             foundit = TRUE;
  868.         else {
  869.             search = search->next;
  870.             which++;
  871.         }
  872.     }
  873.     if (foundit == FALSE)
  874.         return(0);     /* if for some reason I can't find the font, use */
  875.                        /* the first font available. */
  876.     i = 0;
  877.     while ((i < search->sizes) && (search->size[i] != fontsize))
  878.         i++;
  879.     if (i != search->sizes)
  880.         search->whichsel = i;
  881.     else
  882.         search->whichsel = 0;
  883.  
  884.     return(which);
  885.  
  886. }
  887.  
  888. void mygadssetup()
  889. {
  890.  
  891.     register loop;
  892.  
  893.     Gadget12.NextGadget = &thegads[0];
  894.  
  895.     for (loop = 0; loop < 14; loop++) {
  896.         if (loop != 13)
  897.             thegads[loop].NextGadget = &thegads[loop + 1];
  898.         else
  899.             thegads[loop].NextGadget = NULL;
  900.         if (loop < 7)
  901.             thegads[loop].LeftEdge = 8;
  902.         else
  903.             thegads[loop].LeftEdge = 250;
  904.         if (loop < 7)
  905.             thegads[loop].TopEdge = (loop * 8) + 10;
  906.         else
  907.             thegads[loop].TopEdge = ((loop - 7) * 8) + 10;
  908.         if (loop < 7)
  909.             thegads[loop].Width = 184;
  910.         else
  911.             thegads[loop].Width = 24;
  912.         thegads[loop].Height = 8;
  913.         if (loop == 3)
  914.             thegads[loop].Flags = GADGHCOMP | SELECTED;
  915.         else
  916.             thegads[loop].Flags = GADGHCOMP;
  917.         thegads[loop].Activation = RELVERIFY;
  918.         thegads[loop].GadgetType = BOOLGADGET | REQGADGET;
  919.         thegads[loop].GadgetRender = NULL;
  920.         thegads[loop].SelectRender = NULL;
  921.         thegads[loop].GadgetText = &theitext[loop];
  922.         thegads[loop].MutualExclude = NULL;
  923.         thegads[loop].SpecialInfo = NULL;
  924.         thegads[loop].GadgetID = 1000 + loop;
  925.         thegads[loop].UserData = NULL;
  926.  
  927.         theitext[loop].FrontPen = 1;
  928.         theitext[loop].BackPen = 0;
  929.         theitext[loop].DrawMode = JAM2;
  930.         theitext[loop].LeftEdge = 0;
  931.         theitext[loop].TopEdge = 0;
  932.         theitext[loop].ITextFont = NULL;
  933.         if (loop < 7)
  934.             theitext[loop].IText = (UBYTE *)&thetext1[loop];
  935.         else
  936.             theitext[loop].IText = (UBYTE *)&thetext2[loop - 7];
  937.         theitext[loop].NextText = NULL;
  938.     }
  939.  
  940. }
  941.  
  942. USHORT proppos(line, maxline)
  943. int line;
  944. int maxline;
  945. {
  946.  
  947.     ULONG duh;
  948.  
  949.     if (maxline == 1)
  950.         duh = MAXBODY;
  951.     else
  952.         duh = (MAXBODY * (line - 1)) / (maxline - 1);
  953.  
  954.     return ((USHORT)duh);
  955.  
  956. }
  957.  
  958. USHORT propsize(display, maxdisplay)
  959. int display;
  960. int maxdisplay;
  961. {
  962.  
  963.     ULONG duh;
  964.  
  965.     if (display >= maxdisplay)
  966.         duh = MAXPOT;
  967.     else
  968.         duh = (MAXPOT * display) / maxdisplay;
  969.  
  970.     return((USHORT)duh);
  971.  
  972. }
  973.  
  974. int propline(proppos, maxline)
  975. USHORT proppos;
  976. int maxline;
  977. {
  978.  
  979.     int duh;
  980.  
  981.     duh = (proppos * maxline) / MAXPOT;
  982.  
  983.     return(duh);
  984.  
  985. }
  986.  
  987. void selectfont()
  988. {
  989.  
  990.     struct IntuiMessage *message;
  991.  
  992.     struct fontinfo *thefont, *duh;
  993.  
  994.     int cont = TRUE,
  995.         refresh = TRUE,
  996.         nameline, sizeline,
  997.         which,
  998.         rfontlastline, rsizelastline;
  999.  
  1000.     register loop;
  1001.  
  1002.     ULONG  class;
  1003.  
  1004.     USHORT fontpropsize, fontproppos, sizepropsize, sizeproppos;
  1005.  
  1006.     which = findfont();
  1007.     thefont = (struct fontinfo *)fontaddress(which);
  1008.  
  1009.     Request(&requester1, window);
  1010.  
  1011.     nameline = which;
  1012.     sizeline = 0;
  1013.  
  1014.     rfontlastline = numfonts;
  1015.  
  1016.     fontpropsize = propsize(7, numfonts);
  1017.  
  1018.     while (cont) {
  1019.  
  1020.         if (refresh) {
  1021.  
  1022.             rsizelastline = (thefont->sizes - 7) + 1;
  1023.             if (rsizelastline < 1)
  1024.                 rsizelastline = 1;
  1025.  
  1026.             sizepropsize = propsize(7, thefont->sizes);
  1027.             fontproppos = proppos((nameline + 1), rfontlastline);
  1028.             sizeproppos = proppos((sizeline + 1), rsizelastline);
  1029.  
  1030.             NewModifyProp(&R_Font, window, &requester1, AUTOKNOB | FREEVERT, -1, fontproppos, -1, fontpropsize, 0);
  1031.             NewModifyProp(&R_Size, window, &requester1, AUTOKNOB | FREEVERT, -1, sizeproppos, -1, sizepropsize, 0);
  1032.  
  1033.             for (loop = -3; loop < 4; loop++)
  1034.                 if (((loop + nameline) < 0) || ((loop + nameline) >= numfonts))
  1035.                     strcpy(thetext1[loop + 3], "                       ");
  1036.                 else {
  1037.                     duh = (struct fontinfo *)fontaddress(nameline + loop);
  1038.                     sprintf(thetext1[loop + 3], "%-23s", duh->name);
  1039.                 }
  1040.             for (loop = 0; loop < 7; loop++)
  1041.                 if ((loop + sizeline) < thefont->sizes) {
  1042.                     sprintf(thetext2[loop], "%3d", thefont->size[loop + sizeline]);
  1043.                     if ((loop + sizeline) == thefont->whichsel)
  1044.                         thegads[loop + 7].Flags = GADGHCOMP | SELECTED;
  1045.                     else
  1046.                         thegads[loop + 7].Flags = GADGHCOMP;
  1047.                 }
  1048.                 else {
  1049.                     strcpy(thetext2[loop], "   ");
  1050.                     thegads[loop + 7].Flags = GADGHCOMP;
  1051.                 }
  1052.             RefreshGadgets(&thegads[0], window, &requester1);
  1053.             refresh = FALSE;
  1054.         }
  1055.  
  1056.         Wait(1 << window->UserPort->mp_SigBit);
  1057.  
  1058.         while (message = (struct IntuiMessage *)GetMsg(window->UserPort)) {
  1059.             class = message->Class;
  1060.             whichgad = (struct Gadget *)message->IAddress;
  1061.             ReplyMsg(message);
  1062.  
  1063.             if (class == GADGETUP) {
  1064.                 if (whichgad->GadgetID == 11) /* FontUp */
  1065.                     if (nameline > 0) {
  1066.                         refresh = TRUE;
  1067.                         --nameline;
  1068.                         thefont = (struct fontinfo *)fontaddress(nameline);
  1069.                     }
  1070.                 if (whichgad->GadgetID == 12) { /* Font */
  1071.                     refresh = TRUE;
  1072.                     fontproppos = R_FontSInfo.VertPot;
  1073.                     nameline = propline(fontproppos, rfontlastline);
  1074.                     if ((nameline + 1) >= rfontlastline)
  1075.                         nameline = rfontlastline - 1;
  1076.                     thefont = (struct fontinfo *)fontaddress(nameline);
  1077.                 }
  1078.                 if (whichgad->GadgetID == 13) /* FontDown */
  1079.                     if ((nameline + 1) < rfontlastline) {
  1080.                         refresh = TRUE;
  1081.                         ++nameline;
  1082.                         thefont = (struct fontinfo *)fontaddress(nameline);
  1083.                     }
  1084.                 if (whichgad->GadgetID == 21) /* SizeUp */
  1085.                     if (sizeline > 0) {
  1086.                         refresh = TRUE;
  1087.                         --sizeline;
  1088.                     }
  1089.                 if (whichgad->GadgetID == 22) { /* Size */
  1090.                     refresh = TRUE;
  1091.                     sizeproppos = R_SizeSInfo.VertPot;
  1092.                     sizeline = propline(sizeproppos, rsizelastline);
  1093.                     if ((sizeline + 1) >= rsizelastline)
  1094.                         sizeline = rsizelastline - 1;
  1095.                 }
  1096.                 if (whichgad->GadgetID == 23) /* SizeDown */
  1097.                     if ((sizeline + 1) < rsizelastline) {
  1098.                         refresh = TRUE;
  1099.                         ++sizeline;
  1100.                     }
  1101.                 if (whichgad->GadgetID == 101) { /* OK */
  1102.                     cont = FALSE;
  1103.                     strcpy(fontname, thefont->name);
  1104.                     strcat(fontname, ".font");
  1105.                     fontsize = thefont->size[thefont->whichsel];
  1106.                 }
  1107.                 if (whichgad->GadgetID == 102) /* Cancel */
  1108.                     cont = FALSE;
  1109.                 if ((whichgad->GadgetID > 999) &&
  1110.                     (whichgad->GadgetID < 1007)) {
  1111.                     refresh = TRUE;
  1112.                     nameline += (whichgad->GadgetID - 1003);
  1113.                     if (nameline < 0)
  1114.                         nameline = 0;
  1115.                     if ((nameline + 1) > rfontlastline)
  1116.                         nameline = rfontlastline - 1;
  1117.                     thefont = (struct fontinfo *)fontaddress(nameline);
  1118.                 }
  1119.                 if ((whichgad->GadgetID > 1006) &&
  1120.                     (whichgad->GadgetID < 1014)) {
  1121.                     refresh = TRUE;
  1122.                     thefont->whichsel = (whichgad->GadgetID - 1007) + sizeline;
  1123.                     if (thefont->whichsel >= thefont->sizes)
  1124.                         thefont->whichsel = thefont->sizes - 1;
  1125.                 }
  1126.             }
  1127.         }
  1128.     }
  1129.  
  1130. }
  1131.  
  1132. void mycat(s, c)
  1133. char *s;
  1134. char c;
  1135. {
  1136.  
  1137.     while (*s++ != '\0') {}
  1138.     *(s - 1) = c;
  1139.     *s = '\0';
  1140.  
  1141. }
  1142.  
  1143. void main(argc,argv)
  1144. int argc;
  1145. char *argv[];
  1146. {
  1147.  
  1148.     struct IntuiMessage *message;
  1149.  
  1150.     int cont = TRUE,
  1151.         brandnewfont = TRUE,
  1152.         refresh = TRUE;
  1153.  
  1154.     ULONG   class;
  1155.     USHORT  code;
  1156.  
  1157.     char c;
  1158.     int line, maxline,
  1159.         yoffset,
  1160.         yarea,
  1161.         startchar,
  1162.         len,
  1163.         whichmenu, whichitem,
  1164.         wproplastline;
  1165.  
  1166.     USHORT range[256][2], numy, pos, size;
  1167.  
  1168.     register loop, i;
  1169.  
  1170.     if ((argc == 2) && (*argv[1] == '?'))
  1171.         cleanup("Usage: ShowFont [font_name] [font_size]");
  1172.  
  1173.     if ((IntuitionBase = (struct IntuitionBase *)
  1174.             OpenLibrary("intuition.library", 0)) == NULL)
  1175.         cleanup("ShowFont: couldn't open 'intuition.library'.");
  1176.  
  1177.     if ((GfxBase = (struct GfxBase *)
  1178.             OpenLibrary("graphics.library", 0)) == NULL)
  1179.         cleanup("ShowFont: couldn't open 'graphics.library'.");
  1180.  
  1181.     if ((DiskfontBase = (struct DiskfontBase *)
  1182.             OpenLibrary("diskfont.library", 0)) == NULL)
  1183.         cleanup("ShowFont: couldn't open 'diskfont.library'.");
  1184.  
  1185.     if ((window = (struct Window *)OpenWindow(&newwindow)) == NULL)
  1186.         cleanup("ShowFont: couldn't open the window.");
  1187.     rp = window->RPort;
  1188.  
  1189.     SetMenuStrip(window, &MenuList1);
  1190.  
  1191.     mygadssetup();
  1192.  
  1193.     if (argc == 1)
  1194.         strcpy(fontname, "Topaz.font");
  1195.     else
  1196.         sprintf(fontname, "%s.font", argv[1]);
  1197.     if (argc < 3) {
  1198.         readfonts();
  1199.         fontsize = 0;
  1200.         selectfont();
  1201.         setupfont();
  1202.     }
  1203.     else {
  1204.         fontsize = atoi(argv[2]);
  1205.         setupfont();
  1206.     }
  1207.  
  1208.     while (cont) {
  1209.  
  1210.         if (brandnewfont) {
  1211.  
  1212.             startchar = font->tf_LoChar;
  1213.             if (startchar == 0)
  1214.                 startchar = 1;
  1215.             line = 0;
  1216.             textline[0] = '\0';
  1217.  
  1218.             for (loop = font->tf_LoChar; loop <= font->tf_HiChar; ++loop) {
  1219.                 c = loop;
  1220.                 mycat(textline, c);
  1221.                 len = window->BorderLeft + IntuiTextLength(&text) + font->tf_XSize;
  1222.                 if (len > XAREA) {
  1223.                     range[line][0] = startchar;
  1224.                     range[line][1] = loop - 1;
  1225.                     startchar = loop;
  1226.                     line++;
  1227.                     textline[0] = '\0';
  1228.                 }
  1229.                 else
  1230.                     if (loop == font->tf_HiChar) {
  1231.                         range[line][0] = startchar;
  1232.                         range[line][1] = font->tf_HiChar;
  1233.                     }
  1234.             }
  1235.  
  1236.             maxline = line;
  1237.             line = 0;
  1238.             yarea = 200 - (window->BorderTop + window->BorderBottom);
  1239.             numy = yarea / font->tf_YSize;
  1240.  
  1241.             wproplastline = (maxline - numy) + 1;
  1242.             if (wproplastline < 1)
  1243.                 wproplastline = 1;
  1244.  
  1245.             size = propsize(numy, maxline);
  1246.             pos = 0;
  1247.  
  1248.             brandnewfont = FALSE;
  1249.             refresh = TRUE;
  1250.         }
  1251.  
  1252.         if (refresh) { /* display the characters, update gadgets */
  1253.  
  1254.             pos = proppos((line + 1), wproplastline);
  1255.  
  1256.             ModifyProp(&W_Prop, window, NULL, AUTOKNOB | FREEVERT, -1, pos, -1, size);
  1257.  
  1258.             SetAPen(rp, 0); /* clear the screen */
  1259.             RectFill(rp, window->BorderLeft, window->BorderTop, XAREA, 200 - window->BorderBottom);
  1260.             SetAPen(rp, 1);
  1261.  
  1262.             yoffset = window->BorderTop;
  1263.  
  1264.             for (loop = line; (((loop - line) < numy) && (loop <= maxline)); ++loop) {
  1265.                 textline[0] = '\0';
  1266.                 for (i = range[loop][0]; i <= range[loop][1]; i++) {
  1267.                     c = i;
  1268.                     mycat(textline, c);
  1269.                 }
  1270.                 PrintIText(rp, &text, window->BorderLeft, yoffset);
  1271.                 yoffset += font->tf_YSize;
  1272.             }
  1273.             refresh = FALSE;
  1274.         }
  1275.  
  1276.         Wait(1 << window->UserPort->mp_SigBit);
  1277.  
  1278.         while (message = (struct IntuiMessage *)GetMsg(window->UserPort)) {
  1279.             class = message->Class;
  1280.             code  = message->Code;
  1281.             whichgad = (struct Gadget *)message->IAddress;
  1282.             ReplyMsg(message);
  1283.  
  1284.             if (class == CLOSEWINDOW)
  1285.                 cont = FALSE;
  1286.             if (class == GADGETUP) {
  1287.                 if (whichgad->GadgetID == 1) /* - */
  1288.                     if (line > 0) {
  1289.                         refresh = TRUE;
  1290.                         --line;
  1291.                     }
  1292.                 if (whichgad->GadgetID == 2) { /* slider */
  1293.                     refresh = TRUE;
  1294.                     pos = W_PropSInfo.VertPot;
  1295.                     line = propline(pos, wproplastline);
  1296.                     if ((line + 1) > wproplastline)
  1297.                         line = wproplastline - 1;
  1298.                 }
  1299.                 if (whichgad->GadgetID == 3) /* + */
  1300.                     if ((line + 1) < wproplastline) {
  1301.                         refresh = TRUE;
  1302.                         ++line;
  1303.                     }
  1304.             }
  1305.             if (class == MENUPICK) {
  1306.                 if (code != MENUNULL) {
  1307.                     whichmenu = MENUNUM(code);
  1308.                     whichitem = ITEMNUM(code);
  1309.                     switch (whichmenu) {
  1310.                         case 0 : switch (whichitem) {
  1311.                                     case 0: Request(&requester2, window); /* about */
  1312.                                             break;
  1313.                                     case 1: cont = FALSE; /* quit */
  1314.                                             break;
  1315.                                  }
  1316.                                  break;
  1317.                         case 1 : refresh = TRUE;
  1318.                                  switch (whichitem) {
  1319.                                     case 0: readfonts(); /* read FONTS: */
  1320.                                             selectfont();
  1321.                                             setupfont();
  1322.                                             brandnewfont = TRUE;
  1323.                                             break;
  1324.                                     case 1: selectfont();
  1325.                                             setupfont();
  1326.                                             brandnewfont = TRUE;
  1327.                                             break; /* font selection */
  1328.                                  }
  1329.                                  break;
  1330.                     }
  1331.                 }
  1332.             }
  1333.         }
  1334.     }
  1335.  
  1336.     cleanup(NULL);
  1337.  
  1338. }
  1339.